缓存管理 ROS在内存管理和缓存管理方面都是虚有其表——只有接口是一样的,里面的实现与windows大相径庭,以下资料来源于wrk,internals。 缓存管理是对于文件数据在内存中的特殊管理,基于内存管理,向文件系统提供服务。而在内存管理器将缓存页面真正写入磁盘时,又调用文件系统的接口然后走磁盘设备驱动。 ★.重要结构 1.Virtual Address Control Block 虚拟地址控制块(核心) 结构不大~ 描述了系统缓存的一个槽,系统缓存以256k为一个槽(也成为一个view),当进行读写操作时,数据才是活动的(Active),当不活动之后映射不会消失,除非缓存槽已经用尽,他们将被撤除。 CcVacbs是一个数组,记录了每个VACB的地址 typedef struct _VACB {
PVOID BaseAddress; struct _SHARED_CACHE_MAP *SharedCacheMap; 被映射到一个文件时,它指向文件的共享缓存表 union {
LARGE_INTEGER FileOffset; 这份视图在文件中的偏移 USHORT ActiveCount; 引用计数 } Overlay; LIST_ENTRY LruList; 管理列表,空闲或者可重用的视图链表(CcVacbFreeList,CcVacbLru) } VACB, *PVACB; 2. PRIVATE_CACHE_MAP 存储于FILE_OBJECT之中的私有缓存表 属于文件对象 typedef struct _PRIVATE_CACHE_MAP {
union {
CSHORT NodeTypeCode; PRIVATE_CACHE_MAP_FLAGS Flags; ULONG UlongFlags; }; ULONG ReadAheadMask; PFILE_OBJECT FileObject; LARGE_INTEGER FileOffset1; //包含最近两次读的位置 LARGE_INTEGER BeyondLastByte1; LARGE_INTEGER FileOffset2; LARGE_INTEGER BeyondLastByte2; LARGE_INTEGER ReadAheadOffset[2];